#include "main.h"
#include "fatfs.h"
#include "decode.h"
#include "Programmer.h"

/****************************************************************************************
-
-   函数名: void LedBlink(uint8_t Num)
-   功能  : LED闪烁
-   输入  : Num:    LED闪烁次数
-   返回  : 无
-
****************************************************************************************/
void LedBlink(uint8_t Num)
{
    for(uint8_t i=0;i<Num;i++)
    {
        LED0_GPIO_Port->BSRR = (uint32_t)LED0_Pin << 16u;
        HAL_Delay(100);
        LED0_GPIO_Port->BSRR = LED0_Pin;
        HAL_Delay(200);
    }
    HAL_Delay(500);
}

/****************************************************************************************
-
-   函数名: void User_Main(void)
-   功能  : 用户main循环
-   输入  : 无
-   返回  : 无
-
****************************************************************************************/
void User_Main(void)
{
    char path[4]= {"0:"};
    uint8_t BurnFlag=0;//烧录标志位
    uint32_t sizelen=0;
    uint32_t MainLoopTime=0;
    FRESULT FATFS_Status;
    
    FATFS_Status = f_mount(&USERFatFS, path, 1);//挂载存储器
    f_mkdir("0:/FW");                           //创建FW文件夹，用于存放Hex文件
    //打开工程文件，这个版本的FATFS不给创建.project结尾的文件似的，只能用bin文件代替
    FATFS_Status = f_open(&USERFile ,"0:/FW/release.bin",FA_READ);
    f_close(&USERFile);//关闭文件
    //开始检测是否存在release.bin文件，不存在则创建
    if(FATFS_Status == FR_OK)
    {
        BurnFlag =1;//工程文件存在，标记可以烧录，LED亮
        LED0_GPIO_Port->BSRR = (uint32_t)LED0_Pin << 16u;
        FATFS_Status = f_open(&USERFile ,"0:/FW/info.bin",FA_READ);//读取烧录成功数
        if(FATFS_Status == FR_OK)
        {
            //读取2个字节数据
            FATFS_Status = f_read(&USERFile,FlashTarget.FW_Buf,2,&sizelen);
            //获取成功数
            if(FATFS_Status == FR_OK)
            {
                FlashTarget.FlashOk[0] = FlashTarget.FW_Buf[0]<<8 | FlashTarget.FW_Buf[1];
            }
            f_close(&USERFile);
        }
    }
    else//工程文件不存在，开始解析
    {
        LED0_GPIO_Port->BSRR = LED0_Pin;//LED灭
        FATFS_Status = f_open(&USERFile ,"0:/FW/release.hex",FA_READ);//打开release.hex
        f_close(&USERFile);//关闭文件
        if(FATFS_Status == FR_OK)
        {
            //文件存在，开始解析
            printf("Start decode hex\n");
            if(SaveProjectFile(&FlashTarget) == 1)//判断解析结果。
            {
                BurnFlag = 1;//解析成功，标记可以烧录，LED亮
            }
            else
            {
                BurnFlag = 0;//解析失败，标记不能烧录
            }
        }
    }
    ProgrammerInit();               //编程器初始化
    MainLoopTime = HAL_GetTick();   //获取系统当前时间
    while (BurnFlag)                //循环自动烧录
    {
        //每1s钟更新一次状态
        if(HAL_GetTick() - MainLoopTime >= 1000)
        {
            MainLoopTime = HAL_GetTick();
            if(FlashTarget.Status[0] == 1) //烧录成功，请更换新的芯片
            {
                LedBlink(3);//  LED三闪
                printf("Programmer ok,Please connect IC\n");
            }
            else//当前没有连接芯片，请连接芯片
            {
                LedBlink(1);//LED单闪
                printf("Please connect IC,Auto mode programming\n");
            }
        }
        //开始烧录，自动检测芯片自动烧录
        ProgrammerWork(&FlashTarget);
    }
    while(1)
    {
        if(HAL_GetTick() - MainLoopTime >= 1000)
        {
            printf("not found release.hex  !!!!\n");
            MainLoopTime = HAL_GetTick();
            HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
        }
    }
}


